{T}

ChatGPT 微服务应用体系构建

  1. **课程首页:**https://t.zsxq.com/0d3o5FKvc
  2. 本章重点:开篇介绍课程信息以及如何进入学习。后续也会把一些共性的学习问题在这里说明
  3. 本章源码https://gitcode.net/KnowledgePlanet/chatgpt - 以围绕 ChatGPT 所需的场景进行设计和实现,UI/Client、API 等。并涵盖以提供支撑业务开发的组件 SDK 提供服务,用于基础建设设施层的物料,此服务与 ChatGPT 业务开发解耦
  4. 课程视频https://t.zsxq.com/0dYzxHlZv

项目概述

核心是关于 微服务应用体系的构建,通过讲解配置 Docker、Nginx、SSL 等环境以及开发出鉴权、认证、微信公众号、企业微信、支付宝交易等模块的方式,完善体系的物料服务。而 ChatGPT 只是其中的一种产品形态而已,这种产品形态通过 API 的方式与具体的物料服务模块解耦。这样做的方式是因为基础的物料【物料指 SDK 和服务】并不会频繁变化,而离业务最近的 API 会随业务变动发生较多的改动。所以这样的应用架构方式,在互联网大厂中也是非常常见和常用的。

这些东西的价值在于架构思维,而不是永远的在 CV+CRUD。可以把项目中所涉及的组件开发,都能进行任意物料模块与需要对接的服务进行关联打通使用。方便写到简历、用到项目、实战锻炼、积累经验

拓扑结构

以工程拓扑的视角看下这套需要开发的系统

如拓扑结构,系统从上到下以不同的产品形态,统一调用封装的服务API进行功能的流转。API系统中所处理的核心动作,会以各个物料模块进行实现。所以这里会拆分出标准的 ChatGPT-API 业务系统,之后再由各个模块系统支撑。到具体的模块中再进行详细的系统设计。

技术使用

此项目会使用到 SpringBoot、MyBatis、MySQL、Redis 等技术栈,但因本项目主要以小成本,轻量维护的实际使用为主,所以不会过多引入分布式技术栈。所以在设计实现上,主要以小而美、小而精,且能匹配到真实场景的使用为主。—— 分布式技术栈是为了更大规模的体量使用,但也会为此付出运维和应用服务器成本。所以一些中小厂的项目或者创业类型的项目,都会优先更轻量级技术栈使用,以此减少这部分成本。

除技术栈的使用外,涉及到开发工具包括;IntelliJ IDEA、WebStorm、Docker、Protainter、Nginx、Git、Maven、Navicat、SSH 工具等,以满足开发代码中的使用。

关于此项目可能还会涉及少部分 Next.js、Typescript 等前端知识,方便做 Web UI 的开发

项目计划

课程会包括,基础设置、模块开发、API 服务等几块内容,而基础设施主要为一些基本操作。这里会分为 3 个大的步骤;

  1. 在基础设置的基本必备服务搭建后,会进入接口鉴权的简单开发,这个模块开发后,大家就可以简单的使用了小傅哥提供的 OpenAI 了接口了。—— 当然你如果自己有 OpenAI 接口,也可以直接使用。 https://huggingface.co/ 也提供了一些可以免费使用的简单 Open-API
  2. 有了这部分内容的使用,后续会进入 API-SDK 的开发,以及网页的简单开发。通过这样的开发构成一套基本的模块服务。ChatGPT-WEB-UI -> API-SDK -> 鉴权 -> OpenAI 的使用。
  3. ChatGPT-WEB-UI 流程跑通后,就可以逐步扩展其他服务模块。让业务与场景结合,如关注公众号、公众号回复、企业微信机器人、交易支付购买授权 Token。这个过程可以让 ChatGPT-WEB-UI 与各个模块结合使用

开始

课程会以视频、小册、代码、作业的方式进行推进,视频主要以演示操作、讲解核心的方式进行,并在小册和对应的代码中细化细节展示

推荐工具:

  1. Termius:云服务器链接工具,自带一套 SFTP 工具,很好用
  2. IDEA 插件:Sequence Diagram - 用于方法上右键查看代码流程的,主要帮助大家理解代码
  3. Docker - 可本地安装,不需要非得购买云服务器,也可以满足学习诉求。
  4. natapp - 内网穿透工具,相当于你开启后,可以分配给你一个域名,让外网访问到你的服务

Docker环境配置

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Mac、Linux或Windows操作系统的机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。总之它加快构建、共享和运行现代应用程序的速度

本地安装 Docker 环境,方便测试验证。开发阶段暂时也不需要云服务器。Docker 的安装非常简单,只需要选择适合你的机器版本。Mac、Windows、Linux,直接一步步安装即可。安装完成后,按照自己的机器配置一个适合的空间占用

云服务器安装 docker

centos 7.6 版本安装一个 Docker 容器

查看内核版本,x86_64 位系统,如果是 32 位是不能安装 docker 的

python
# 查看内核版本
uname -r
# 3.10.0-1160.119.1.el7.x86_64

# yum 更新到最新版本
sudo yum update

# 安装 Docker 所需的依赖包,整个过程需要 1-3 分钟左右
sudo yum install -y yum-utils device-mapper-persistent-data lvm2

# 查看仓库所有Docker版本(选做)
yum list docker-ce --showduplicates | sort -r

# 安装 docker(默认最新的版本),安装指定版本:sudo yum install docker-ce-20.10.11.ce
sudo yum install docker

# 启动 Docker
sudo systemctl start docker

# 开机启动
systemctl enable docker

# 查看 Docker 版本
docker --version

# 卸载 Docker
sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-selinux \
                  docker-engine-selinux \
                  docker-engine

Docker 常用命令

python
docker --help    # Docker 帮助
docker --version   # 查看 Docker 版本
docker search <image>  # 搜索镜像文件,如:docker search mysql
docker pull <image>  # 拉取镜像文件, 如:docker pull mysql
docker images    # 查看已经拉取下来的所以镜像文件
docker rmi <image>  # 删除指定镜像文件
docker run --name <name> -p 80:8080 -d <image>  # 发布指定镜像文件
docker ps     # 查看正在运行的所有镜像
docker ps -a    # 查看所有发布的镜像
docker rm <image>   # 删除执行已发布的镜像

配置镜像

由于某些原因,Docker Hub 官方仓库在国内已经无法拉取,如果是国内网络环境,可配置国内镜像使用,从而解决 Docker 镜像拉取失败或缓慢问题

python
# 创建目录
sudo mkdir -p /etc/docker

# 写入镜像配置
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://dockerproxy.com",
    "https://docker.mirrors.ustc.edu.cn",
    "https://docker.nju.edu.cn",
    "https://docker.linkedbus.com",
    "https://docker.xuanyuan.me",
    "https://ustc-edu-cn.mirror.aliyuncs.com/",
    "https://ccr.ccs.tencentyun.com/"
  ]
}
EOF

# 重启docker服务
sudo systemctl daemon-reload
sudo systemctl restart docker

补充:配置阿里云镜像步骤 https://cr.console.aliyun.com/cn-shanghai/instances/mirrors

Portainer

python
docker pull portainer/portainer
docker run -d --restart=always --name portainer -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer

创建账号:

python
admin
admin123456admin

查看运行的 docker 容器:http://124.222.10.5:9000/#!/2/docker/containers

Nginx 环境配置

bash
docker stop Nginx
docker restart Nginx
docker rm Nginx
docker rmi Nginx
docker exec -it Nginx /bin/bash

Nginx 的使用包括的配置有;配置、首页、日志、SSL等,而这些内容在默认基础安装的情况下,都是在 Docker 容器中的,不容易被管理和使用。所以一般是在安装 Nginx 的时候是需要做映射处理。这个时候可以把在 Docker 上安装的 Nginx 配置信息拷贝到本地,之后做一些修改后,再去重新执行 Nginx 的安装【重新安装前记得把之前的 Nginx 删掉】

python
# 进入服务:
docker exec -it Nginx /bin/bash

# 查看配置:
ls /etc/nginx/

# 查看页面:
ls /usr/share/nginx/html

其他说明:conf.d 是个文件夹,所有这个文件夹下的 Nginx 配置文件【default.conf】都会被 nginx.conf 加载。所以后面的 Nginx 配置,也主要是来修改这个文件

创建目录

bash
# -p 表示一次创建多个目录结构
mkdir -p /data/nginx/conf
mkdir -p /data/nginx/logs
mkdir -p /data/nginx/certs

配置 Nginx

bash
docker pull nginx

cd /
mkdir mydata
cd mydata

mkdir nginx
cd nginx/

mkdir logs
mkdir html
mkdir conf

cd conf
touch nginx.conf

将以下内容填到 nginx.conf 文件中

python
user  nginx; #设置nginx服务的系统使用用户
worker_processes  1; #工作进程数

error_log  /var/log/nginx/error.log warn; #nginx的错误日志
pid        /var/run/nginx.pid; #nginx启动时候的pid

events {
    worker_connections  1024; #每个进程允许的最大连接数
}

http { #http请求配置,一个http可以包含多个server

    #定义 Content-Type
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    #日志格式 此处main与access_log中的main对应
    #$remote_addr:客户端地址
    #$remote_user:http客户端请求nginx认证的用户名,默认不开启认证模块,不会记录
    #$timelocal:nginx的时间
    #$request:请求method + 路由 + http协议版本
    #status:http reponse 状态码
    #body_bytes_sent:response body的大小
    #$http_referer:referer头信息参数,表示上级页面
    #$http_user_agent:user-agent头信息参数,客户端信息
    #$http_x_forwarded_for:x-forwarded-for头信息参数
    log_format  main  '$http_user_agent' '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    #访问日志,后面的main表示使用log_format中的main格式记录到access.log中
    access_log  /var/log/nginx/access.log  main;

    #nginx的一大优势,高效率文件传输
    sendfile        on;
    #tcp_nopush     on;

    #客户端与服务端的超时时间,单位秒
    keepalive_timeout  65;

    #gzip  on;
    server { #http服务,一个server可以配置多个location
        listen       80; #服务监听端口
        server_name  localhost; #主机名、域名
    
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
    
        location / {
            root   /usr/share/nginx/html; #页面存放目录
            index  index.html index.htm; #默认页面
        }
    
        #error_page  404              /404.html;
    
        # 将500 502 503 504的错误页面重定向到 /50x.html
        error_page   500 502 503 504  /50x.html;
        location = /50x.html { #匹配error_page指定的页面路径
            root   /usr/share/nginx/html; #页面存放的目录
        }
    
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}
    
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }
    include /etc/nginx/conf.d/*.conf;
}

运行容器并把 nginx 容器的配置文件挂载到主机

python
docker run -d -p 80:80 --name nginx --privileged=true -v /mydata/nginx/conf/nginx.conf:/etc/nginx/nginx.conf -v /mydata/nginx/html:/etc/nginx/html -v /mydata/nginx/logs:/var/log/nginx nginx

mac 配置 nginx

python
docker pull nginx

mkdir -p ~/nginx/conf
mkdir -p ~/nginx/html

cd ~/nginx/conf
touch nginx.conf
vim nginx.conf

填入基本内容

nginx
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

运行容器

python
docker run --name nginx-container \
  -p 80:80 \
  -v ~/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
  -v ~/nginx/html:/etc/nginx/html \
  -d nginx

查看

python
docker ps

# 重启
docker restart nginx-container

# 查看日志
docker logs nginx-container

服务镜像构建和容器部署

通过在工程中配置 Dockerfile 和相关文件,进行镜像的打包和发布,以及 IDEA 中配置 Docker 连接进行镜像和服务的启动关闭管理。

  1. 本章源码:—— 申请访问权限(加入仓库):https://t.zsxq.com/04VB66uzz 部署:https://gitcode.net/KnowledgePlanet/chatgpt/dev-ops/-/tree/230504-xfg-docker 代码:https://gitcode.net/KnowledgePlanet/chatgpt/chatgpt-api/-/tree/230504-xfg-docker
  2. 课程视频https://t.zsxq.com/0dCj8XonL

版本差异(课程环境 → 2026 实践)

特性旧版(2023 课程)当前
Dockerdocker-ce 20.10Docker Engine 27.x/28.x(docker compose 取代 docker-compose
系统CentOS 7.6AlmaLinux 9 / Debian 12 / Ubuntu 22.04+(CentOS 7 已 EOL)
Nginxnginx 1.2xnginx 1.26.x/1.28.x(支持 HTTP/3)
镜像加速daocloud/dockerproxy 等各云厂商专属加速器或自建 registry(公共加速器多已失效)
Portainerportainer/portainerportainer/portainer-ce(2.x,CE 版)

Docker/Nginx 安装与配置流程不变;注意 CentOS 7 已停止维护,镜像加速器需选用当前可用的云厂商地址。